package com.yuefresh.core;

import java.io.Serializable;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

import com.yuefresh.util.BeanUtil;

/**
 * 
 * 
 * @author junhao
 * @since 2010-12-28
 * 
 * @param <T>
 * @param <PK>
 */
public abstract class EntityAtomManager<T extends ModelAtom, PK extends Serializable> {

	protected Logger logger = LoggerFactory.getLogger(getClass());

	protected Class<T> entityClass;//泛型所指定的Class 类型，用于hibernate 查询时使用
	
	@Autowired protected HibernateInvoker hibernateInvoker;
	
	public HibernateInvoker getHibernateInvoker() {
		return hibernateInvoker;
	}

	public void setHibernateInvoker(HibernateInvoker hibernateInvoker) {
		this.hibernateInvoker = hibernateInvoker;
	}
	
	@SuppressWarnings("unchecked")
	public EntityAtomManager() {
		this.entityClass = BeanUtil.getSuperClassGenricType(getClass());
	}

	
	//==============================================================
	/**
	 * 批量保存
	 * 
	 * 实体对象以List的方式传递，循环进行删除
	 * 
	 * @param list
	 */
	public void save(List<T> list) {
		for(T entity: list){
			save(entity);
		}
	}
	
	public void save(final T entity) {
		hibernateInvoker.save(entity);
	}

	/**
	 * 通过修改 isValid 有效性标识，来删除数据，而不是直接从数据库删除
	 * 
	 * @param entity
	 * @return delete object
	 */
	public T delete(final T entity) {
		entity.setIsValid(false);
		save(entity);
		return entity;
	}
	
	public void delete(List<T> list) {
		for(T entity: list){
			entity.setIsValid(false);
		}
		save(list);
	}
	
	/**
	 * @see delete(final T entity)
	 * 
	 * @param id
	 * @return delete object
	 */
	public T delete(final PK id) {
		T entity = get(id);
		delete(entity);
		return entity;
	}
	
	/**
	 * 通过ID 查询获取 实体对象
	 * 
	 * @param id
	 * @return
	 */
	public T get(final PK id) {
		return (T)hibernateInvoker.get(entityClass, id);
	}
	
	/**
	 * 指定 属性查询，返回唯一对象
	 * 
	 * @param propertyName
	 * @param value
	 * @return
	 */
	public T findUnique(String hql, Object... values) {
		return (T)hibernateInvoker.findUnique(entityClass, hql, values);
	}

	/**
	 * Search by hql
	 * 
	 * @param hql
	 * @param values
	 * @return
	 */
	public List<T> find(String hql, Object... values) {
		return hibernateInvoker.find(entityClass, hql, values);
	}
	
	/**
	 * Remove by hql
	 * 
	 * @param hql
	 * @param values
	 * @return
	 */
	public void delete(String hql, Object... values) {
		hibernateInvoker.delete(hql, values);
	}
	
	/**
	 * Remove by hql
	 * 
	 * @param hql
	 * @param values
	 * @return
	 */
	public void update(String hql, Object... values) {
		hibernateInvoker.update(hql, values);
	}
	
	/**
	 * 查询前limit count笔数据
	 * @param hql
	 * @param limitCount
	 * @param values
	 * @return
	 */
	public List<T> find(String hql, int limitCount, Object... values) {
		return hibernateInvoker.find(entityClass, hql, limitCount, values);
	}
	
	/**
	 * 简单分页数据获取器.
	 */
	public List<T> find(String hql, int pageNumber, int pageSize, Object... values) {
		return hibernateInvoker.find(entityClass, hql, pageNumber, pageSize, values);
	}
	
	/**
	 * 按page 分页查询
	 * @param page
	 * @param hql
	 * @param values Object...
	 * @return
	 */
	public Page<T> find(final Page<T> page, String hql, Object... values) {
		return hibernateInvoker.find(entityClass, page, hql, values);
	}
	
	/**
	 * 按page 分页查询
	 * @param page
	 * @param chql count hql
	 * @param hql
	 * @param values Object...
	 * @return
	 */
	public Page<T> find(final Page<T> page, String chql, String hql, Object... values) {
		return hibernateInvoker.find(entityClass, page, chql, hql, values);
	}
}
